package cn.itcast.dmp.utils

import cn.itcast.dmp.config.AppConfigHelper
import okhttp3.{OkHttpClient, Request, Response}
import org.json4s
import org.json4s.JValue
import org.json4s.jackson.JsonMethods.parse

import scala.collection.immutable

/**
  * 使用OkHttpClient请求高德开发API，传递经纬度，获取商圈信息
  */
object HttpUtils {

  /**
    * 创建OkHttpClient
    */
  private val client = new OkHttpClient()


  /**
    * 根据经纬度 获取高德地图响应的商圈信息
    *
    * @param longitude    经度
    * @param latitude     纬度
    * @return             JSON格式的商圈信息
    */
  def getLocationInfo(longitude: Double, latitude: Double): Option[String] = {
    // 1. 确定 URL, 通过确定 URL, 从而确定参数
    val url = AppConfigHelper.AMAP_URL + s"$longitude,$latitude"

    try{
      // 1. 构建Request请求对象
      val request: Request = new Request.Builder()  // 使用建造者设计模式，构建对象
        .url(url)  // 设置请求URL地址
        .get() // 设置请求方式
        .build()

      // 2. 通过httpClient发送请求
      val response: Response = client.newCall(request).execute()

      // 3. 当请求成功以后，获取响应的内容
      if(response.isSuccessful){
        val respStr: String = response.body().string()

        // 返回
        Some(respStr)
      }else{
        None
      }
    }catch {
      case e: Exception => e.printStackTrace(); None
    }

  }

  /**
    * 解析高德地图返回的JSON,返回格式为 商圈1:商圈2:商圈3
    *
    * @param gaodeJson 请求高德获取JSON格式数据
    * @return
    */
  def parseJson(gaodeJson: String): String = {
    // a. 解析JSON数据
    val jValueRoot: JValue = parse(gaodeJson)

    // b. 依据Key名称（节点名称）获取对应值： businessAreas
    val jValue = jValueRoot.\\("businessAreas") // 匹配JSON中所有的字段名称对应的值

    // c. 获取所有的子节点
    val children: immutable.Seq[json4s.JValue] = jValue.children

    // d. 遍历获取每个子节点中name的值（就是商圈信息）
    var businessAreas: String = ""
    for(child <- children){
      // 依据节点name获取对应的值
      val value: JValue = child.\("name")
      //拼接成商圈信息  value.values获取对应的value值
      businessAreas += s"${value.values}:"
    }

    // e. 去掉最后一个：返回解析
    businessAreas.stripSuffix(":")
  }


  /**
    * 根据经纬度，请求高德，返回商圈信息
    *
    * @param longitude 经度
    * @param latitude 维度
    * @return 商圈信息
    */
  def loadGaode2Area(longitude: Double, latitude: Double): String = {
    // 第一步、发起网络请求，响应获取JSON数据
    val jsonOption: Option[String] = getLocationInfo(longitude, latitude)
    // 第二步、如果获取JSON，进行解析
    jsonOption match {
      case Some(gaodeJson) => parseJson(gaodeJson)
      case None => ""
    }
  }


  def main(args: Array[String]): Unit = {

    println(loadGaode2Area(116.310003, 39.991957))

  }
}
